Εισαγωγή

Tο Leonardo XC είναι μια διαδικτυακή πλατφόρμα για την καταγραφή (logbook) και οπτικοποίηση πτήσεων, κυρίως με ελαφρά πτητικά μέσα όπως αλεξίπτωτο πλαγίας ή αετός. Για τα ελληνικά δεδομένα η αντίστοιχη πλατφόρμα φιλοξενείται από τον ιστότοπο αλεξίπτωτου πλαγιάς sky.gr και περιλαμβάνει αρχείο πτήσεων για την τελευταία τουλάχιστον 20ετία.

Το μεγάλο πλήθος πτήσεων που είναι καταχωρημένο σε αυτή την βάση δεδομένων αποτελεί ένα άριστο σύνολο δεδομένων το οποίο μπορεί να αξιοποιηθεί για να αναλυθεί η πτητική δραστηριότητας μιας περιοχής πτήσεων από ένα σημείο απογείωσης, το προφίλ των πιλότων που πετούν σε αυτήν, η διαχρονική δυναμική της ανά τα έτη και η πτητική συμπεριφορά ανά μήνα του έτους. Ωστόσο μία αδυναμία της πλατφόρμας (τουλάχιστον με μια πρώτη ματιά) είναι η δυνατότητα μαζικής εξαγωγής δεδομένων. Η πληροφορική προσφέρει λύση για την εξαγωγή δεδομένων από το διαδίκτυο μέσω μιας τεχνικής που λέγεται Web Scraping και ουσιαστικά συμβάλει στην λήψη και αποθήκευση των δεδομένων σε δομημένη μορφή.

Προκειμένου λοιπόν να εξάγουμε χρήσιμα δεδομένα από τo ελληνικό αρχείο πτήσεων του Leonardo XC χρησιμοποιήσαμε την γλώσσα προγραμματισμού R και την βιβλιοθήκη rvest. Η λήψη των δεδομένων αφορά το σημείο απογείωσης Παραμυθιά (Ελλάδα). Ο κώδικας για την λήψη των δεδομένων δεν διατίθεται δημόσια. Ωστόσο ο κώδικας για την ανάλυση τους είναι διαθέσιμος, μαζί με τα αποτελέσματα (πίνακες, διαγράμματα). Η ανάλυση παρουσιάζεται στην συνέχεια υπό την μορφή λόγιου προγραμματισμού (literate programming).

Ανάλυση δεδομένων

Ανάγνωση του πίνακα δεδομένων

Αρχικά εισάγουμε τις απαραίτητες βιβλιοθήκες.

Σε πρώτο στάδιο γίνεται η ανάγνωση των δεδομένων που έχουμε εξάγει μέσω web scraping από την ιστοσελίδα του Leonardo XC.

Ας δοκιμάσουμε να εκτυπώσουμε τις πρώτες γραμμές του σχετικού πίνακα δεδομένων (data_cleaned).

load("data_cleaned.Rda")
head(data_cleaned)
NA

Ο πίνακας έχει 1405 εγγραφές. Η πρώτη εισαγωγή πτήσης για την συγκεκριμένη περιοχή απογείωσης έγινε στις 2002-05-18 και η τελευταία έγινε (με περιορισμό την ημερομηνία λήψης των δεδομένων) στις 2021-09-11.

Ας δούμε των αριθμών των πτήσεων ανάλογα με τον τύπο του πτητικού μέσου. Είναι χαρακτηριστική η επικράτηση του Παραπέντε.

data_cleaned %>% group_by(type) %>% tally()

Ας κρατήσουμε μόνο τις πτήσεις Παραπέντε.

data_cleaned <- data_cleaned %>%filter(type==c(data_cleaned %>% group_by(type) %>% tally() %>% arrange(n) %>% top_n(1) %>% pull(type))) 
Selecting by n

Ακολουθεί η ανάλυση των δεδομένων μέσω συγκεκριμένων δεικτών και interactive διαγραμμάτων:

Πλήθος πτήσεων ανά έτος.

ggthemr("earth", type="outer", layout="scientific", spacing=2)

p <- data_cleaned %>%  group_by(year) %>% tally() %>% 
ggplot(aes(x=year, y=n)) +
  geom_bar(stat = "identity")+
  geom_smooth(method='lm', formula= y~x, se=F) 
ggplotly(p)  

Όπως φαίνεται από το παραπάνω διάγραμμα το πλήθος των πτήσεων έχει αυξητική τάση μέσα στην εικοσαετία (πράσινη γραμμή). Η αύξηση μπορεί να οφείλεται σε παράγοντες που έχουν να κάνουν με την σταδιακή καταγραφή των πτήσεων στο Leonardo καθώς αυτό καθιερώνεται μέσα στον χρόνο, την συχνότητα των πτήσεων των τοπικών πιλότων, την επισκεψιμότητα της περιοχής λόγω διαφήμισης κτλ.

Μέγιστο Max_altitude, μέγιστη max_distance και μέγιστη xc_distance ανά έτος.

Στα παρακάτω διαγράμματα αποτυπώνεται η διαχρονική ετήσια διακύμανση των καταγραφόμενων μέγιστων για τις μεταβλητές Max_altitude, max_distance & xc_distance. Διαχρονικά φαίνεται ότι ακολουθούν αυξητική τάση.

p1 <-
  data_cleaned %>%  group_by(year) %>% summarise(
    Max_altitude = max(Max_altitude, na.rm = T),
    max_distance = max(max_distance, na.rm = T),
    xc_distance=max(xc_distance)
  ) %>%
  pivot_longer(cols = Max_altitude:xc_distance,
               values_to = "Value") %>% 

ggplot(aes(x=year, y=Value)) +
  geom_bar(stat = "identity")+
  facet_wrap(~name, scales="free" )
  
ggplotly(p1)  

Πιλότος με μέγιστο ύψος (Max_altitude) ανά έτος και πτέρυγα που χρησιμοποίησε.

Στο ακόλουθο διάγραμμα καταγράφεται ανά έτος ποιός πιλότος σημείωσε το μέγιστο υψόμετρο και με ποιά πτέρυγα.

tbl2 <-data_cleaned %>% 
             group_by(year ) %>%
             filter(Max_altitude == max(Max_altitude, na.rm=T)) %>% 
  select(year,pilot, Max_altitude, brand) 
tbl2
NA

Επικρατέστερος πιλοτος

tbl2 %>% group_by(pilot) %>% tally() %>% arrange(desc(n))

Όπως δείχνουν τα αποτελέσματα του πίνακα ο Κώστας Παλλάς είναι ο πιλότος που κατέχει το συγκεκριμένο ρεκορ για πολλά έτη (16).

Πιλότος με μέγιστη max_distance ανά έτος

Ο επόμενος πίνακας δείχνει ανά έτος ποιός πιλότος κατάγραψε την μεγαλύτερη “Μέγιστη απόσταση”.

tbl3 <- data_cleaned %>% 
             group_by(year ) %>%
             filter(max_distance == max(max_distance, na.rm=T)) %>% 
  select(year,pilot, max_distance) %>% arrange(desc(year,max_distance))
tbl3

Επικρατέστερος πιλοτος

tbl3 %>% group_by(pilot) %>% tally() %>% arrange(desc(n))

Το ρεκόρ πλήθους ετών κατέχει ο Κώστας Παλλάς με 11 έτη.

Πιλότος με μέγιστη xc_distance ανά έτος

Κατά αντιστοιχία προκύπτει ο δείκτης για την xc_distance.

tbl4 <- data_cleaned %>% 
             group_by(year ) %>%
             filter(xc_distance == max(xc_distance, na.rm=T)) %>% 
  select(year,pilot, xc_distance)
tbl4

Επικρατέστερος πιλότος

tbl4 %>% group_by(pilot) %>% tally() %>% arrange(desc(n)) 
NA

Πλήθος πτήσεων ανά Μήνα του έτους

Επιπλέον, τα δεδομένα μπορούν να αναλυθούν με βάση τον μήνα. Στο επόμενο διάγραμμα αποδίδεται το πλήθος των πτήσεων ανά μήνα.

tbl5 <- data_cleaned %>% 
             group_by(month) %>%  tally()%>% arrange(desc(n))
p5 <- ggplot(tbl5,aes(x=month, y=n)) +
  geom_bar(stat = "identity")
ggplotly(p5)  

Προκύπτει, όπως είναι αναμενόμενο, οι περισσότερες πτήσεις να γίνονται από το συγκεκριμένο σημείο πτήσης το καλοκαίρι, με μέγιστο αριθμό πτήσεων τον Ιουν.

Μέσο και Max για τις μεταβλητές Max_altitude και xc_distance, ανά μήνα

tbl6 <- data_cleaned %>% 
             group_by(month) %>%summarise(MAX_Max_altitude  = max(Max_altitude, na.rm=T),
                                          Mean_Max_altitude = mean(Max_altitude, na.rm=T),
                                          Max_xc_distance = max(xc_distance, na.rm=T),
                                          Mean_xc_distance = mean(xc_distance, na.rm=T),
                                          )

Διάγραμμα μέγιστου ύψους (Max_altitude)

Στο παρακάτω διάγραμμα παρουσιάζεται η μέση τιμή και το μέγιστο για την μεταβλητή Μέγιστο ύψος (Max_altitude).

p6 <- ggplot(tbl6 %>% 
  pivot_longer(cols = MAX_Max_altitude:Mean_Max_altitude,
               values_to = "Value") ,
  ) +
  geom_line(aes(x=month, y=Value, group=name,linetype=name))+
  ylab("meters")

ggplotly(p6)

Διάγραμμα μέγιστης απόστασης XC (xc_distance)

Στο επόμενο διάγραμμα απεικονίζεται η μέση τιμή και το μέγιστο για την μεταβλητή “Απόσταση XC”.

tbl6a <- tbl6 %>% 
  pivot_longer(cols = c(Max_xc_distance,Mean_xc_distance),
               names_to = "Variable",
               values_to = "Value") %>% select(- c(MAX_Max_altitude,Mean_Max_altitude))
p7 <- ggplot(tbl6a)+
  geom_line(aes(x=month, y=Value, group=Variable,linetype=Variable))+
  ylab("Km")

ggplotly(p7) 

Όπως βλέπουμε παρατηρείται περίεργη συμπεριφορά. Το Φεβρουάριο παρατηρείται ένα μέγιστο στο xc_distance με μεγάλη απόκλιση από την μέση xc_distance που καταγράφεται τον μήνα αυτό κατά την διάρκεια των 20 ετών. Πάμε να εντοπίσουμε ποιά είναι η πτήση αυτή και ποιός την έκανε

data_cleaned %>% filter(xc_distance==tbl6a %>% filter(month=="Φεβ" & Variable=='Max_xc_distance') %>% pull(Value)) %>% 
  select(pilot,URL)
NA

Μέση διάρκεια πτήσης ανά έτος

Ένας σημαντικός δείκτης για ένα σημείο απογείωσης είναι η μέση διάρκεια πτήσης. Στο παρακάτω διάγραμμα ο δείκτης παρουσιάζεται ανά έτος. Είναι χαρακτηριστική η επανάκαμψη και αύξηση της Μέση διάρκεια πτήσης που παρατηρείται από το 2015 (2021 δεν έκλεισε ακόμα).

Sys.setenv(TZ='GMT') 
tbl8 <- data_cleaned %>% group_by(year) %>% 
  summarize(mean_duration=mean(duration, na.rm=T)) 
p8 <- ggplot(tbl8)+
  geom_line(aes(x=year, y=mean_duration))+
  scale_y_chron(format="%H:%M:%S")
ggplotly(p8)  

Μέση διάρκεια πτήσης ανά μήνα

Η Μέση διάρκεια πτήσης έχει περισσότερο ενδιαφέρον τους πιλότους αν εξειδικευτεί ανά μήνα ώστε να γνωρίζουν τα πτητικά χαρακτηριστικά ενός σημείου απογείωσης.

tbl9 <- data_cleaned %>% group_by(month) %>% 
  summarize(mean_duration=mean(duration, na.rm=T)) 

p9 <- ggplot(tbl9,aes(x=month, y=mean_duration, group=1))+
  geom_line()+geom_point()+
  scale_y_chron(format="%H:%M:%S")
ggplotly(p9)  

Πλήθος πτήσεων ανά πιλότο από την πίστα απογείωσης

Ενδιαφέρον έχει και η παρακολούθηση του προφίλ των πιλότων που πετάνε από την συγκεκριμένη περιοχή απογείωσης. Στο παρακάτω παράδειγμα παρατίθεται ένας πίνακας με το πλήθος των πτήσεων από την πίστα απογείωσης. Όπως φαίνεται, τις περισσότερες πτήσεις από την περιοχή απογείωσης τις έχει κάνει ο Κώστας Παλλάς.

data_cleaned %>% group_by(pilot) %>% 
  summarise(n=n()) %>% arrange(desc(n, na.rm=T))
NA

Συνολική xc_distance ανά πιλότο από την πίστα απογείωσης

Αντίστοιχα μπορεί να υπολογιστεί και η Συνολική xc_distance ανά πιλότο.

data_cleaned %>% group_by(pilot) %>% 
  summarise(sum_xc_distance=sum(xc_distance, na.rm=T)) %>% arrange(desc(sum_xc_distance))
NA

Συνολική διάρκεια πτήσεων ανά πιλότο από την πίστα απογείωσης

Παρουσιάζονται οι top 10 πιλότοι. Τα αποτελέσματα είναι σε ώρες(h) :

tbl10 <- data_cleaned %>% 
  group_by(pilot) %>% 
  summarise(duration=sum(duration, na.rm=T)*24) %>% 
  top_n(10) %>% 
  arrange(desc(duration))
Selecting by duration
tbl10
p10 <- tbl10 %>% 
ggplot(aes(x=reorder(pilot, -duration) , y=as.numeric(duration))) +
  geom_bar(stat = "identity")+
  xlab("pilot")+
  ylab("total flight time (h)")+
   theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) 
ggplotly(p10)
NA
NA
NA

Επίλογος

Οι δείκτες που υπολογίστηκαν είναι ενδεικτικοί και δείγμα των δυνατοτήτων που προσφέρονται από την στιγμή που ο χρήστης καταφέρει να ανακτήσει τα δεδομένα που επί χρόνια αποθηκεύονται στο Leonardo XC. Ανάλογα τις απαιτήσεις και τις ανάγκες, τα ερωτήματα προς τα δεδομένα μπορούν να παραμετροποιηθούν και να επικεντρωθούν σε πιο συγκεκριμένα χαρακτηριστικά που αφορούν την σύγκριση πιλότων, περιοχών, ετών ή μηνών. Σε καμία περίπτωση οι συγκρίσεις αυτές δεν θα πρέπει να έχουν σαν αποτέλεσμα την ανάπτυξη ανταγωνιστικού κλίματος ανάμεσα στους πιλότους και την υπέρβαση των ορίων τους και των κανόνων ασφαλείας. Τέλος, κρίνεται αναγκαία μια αναβάθμιση στο Leonardo XC που θα δίνει την δυνατότητα άμεσης εξαγωγής των δεδομένων χωρίς το κόστος και την πολυπλοκότητα διαδικασιών web scraping.

Διευκρίνηση: δεν πετάω με κανένα πτητικό μέσο.

LS0tCnRpdGxlOiAizpHOvc6szrvPhc+Dzrcgz4TOt8+CIM+Az4TOt8+EzrnOus6uz4IgzrTPgc6xz4PPhM63z4HOuc+Mz4TOt8+EzrHPgiDOvM61IM60zrXOtM6/zrzOrc69zrEgTGVvbmFyZG8gWEMgzrrOsc65IM+EzrfOvSBSLiIKYXV0aG9yOiDOm861z4nOvc6vzrTOsc+CIM6bzrnOrM66zr/PggpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRoZW1lOiBsdW1lbgogIHJtYXJrZG93bjo6aHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiBsdW1lbgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdGhlbWU6IGx1bWVuCi0tLQoKIyDOlc65z4POsc6zz4nOs86uCgpUzr8gW0xlb25hcmRvIFhDXShodHRwczovL2dpdGh1Yi5jb20vbGVvbmFyZG94Yy9sZW9uYXJkb3hjKSDOtc6vzr3Osc65IM68zrnOsSDOtM65zrHOtM65zrrPhM+FzrHOus6uIM+AzrvOsc+Ez4bPjM+BzrzOsSDOs865zrEgz4TOt869IM66zrHPhM6xzrPPgc6xz4bOriAobG9nYm9vaykgzrrOsc65IM6/z4DPhM65zrrOv8+Azr/Or863z4POtyDPgM+Ezq7Pg861z4nOvSwgzrrPhc+Bzq/Pic+CIM68zrUgzrXOu86xz4bPgc6sIM+Az4TOt8+EzrnOus6sIM68zq3Pg86xIM+Mz4DPic+CIM6xzrvOtc6+zq/PgM+Ez4nPhM6/IM+AzrvOsc6zzq/Osc+CIM6uIM6xzrXPhM+Mz4IuIM6TzrnOsSDPhM6xIM61zrvOu863zr3Ouc66zqwgzrTOtc60zr/OvM6tzr3OsSDOtyDOsc69z4TOr8+Dz4TOv865z4fOtyDPgM67zrHPhM+Gz4zPgc68zrEgz4bOuc67zr/Ovs61zr3Otc6vz4TOsc65IM6xz4DPjCDPhM6/zr0gzrnPg8+Ez4zPhM6/z4DOvyDOsc67zrXOvs6vz4DPhM+Jz4TOv8+FIM+AzrvOsc6zzrnOrM+CICBbc2t5LmdyXShodHRwOi8vd3d3LnNreS5ncikgzrrOsc65IM+AzrXPgc65zrvOsc68zrLOrM69zrXOuSDOsc+Bz4fOtc6vzr8gz4DPhM6uz4POtc+Jzr0gzrPOuc6xIM+EzrfOvSDPhM61zrvOtc+Fz4TOsc6vzrEgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSAyMM61z4TOr86xLgoKzqTOvyDOvM61zrPOrM67zr8gz4DOu86uzrjOv8+CIM+Az4TOrs+DzrXPic69IM+Azr/PhSDOtc6vzr3Osc65IM66zrHPhM6xz4fPic+BzrfOvM6tzr3OvyDPg861IM6xz4XPhM6uIM+EzrfOvSDOss6sz4POtyDOtM61zrTOv868zq3Ovc+Jzr0gzrHPgM6/z4TOtc67zrXOryDOrc69zrEgzqzPgc65z4PPhM6/IM+Dz43Ovc6/zrvOvyDOtM61zrTOv868zq3Ovc+Jzr0gz4TOvyDOv8+Azr/Or86/IM68z4DOv8+BzrXOryDOvc6xIM6xzr7Ouc6/z4DOv865zrfOuM61zq8gzrPOuc6xIM69zrEgzrHOvc6xzrvPhc64zrXOryDOtyDPgM+EzrfPhM65zrrOriDOtM+BzrHPg8+EzrfPgc65z4zPhM63z4TOsc+CIM68zrnOsc+CIM+AzrXPgc65zr/Ph86uz4Igz4DPhM6uz4POtc+Jzr0gzrHPgM+MIM6tzr3OsSDPg863zrzOtc6vzr8gzrHPgM6/zrPOtc6vz4nPg863z4IsIM+Ezr8gz4DPgc6/z4bOr867IM+Ez4nOvSDPgM65zrvPjM+Ez4nOvSDPgM6/z4Ugz4DOtc+Ezr/Pjc69IM+DzrUgzrHPhc+Ezq7OvSwgzrcgzrTOuc6xz4fPgc6/zr3Ouc66zq4gzrTPhc69zrHOvM65zrrOriDPhM63z4IgzrHOvc6sIM+EzrEgzq3PhM63IM66zrHOuSDOtyDPgM+EzrfPhM65zrrOriDPg8+FzrzPgM61z4HOuc+Gzr/Pgc6sIM6xzr3OrCDOvM6uzr3OsSDPhM6/z4Ugzq3PhM6/z4XPgi4gzqnPg8+Ez4zPg86/IM68zq/OsSDOsc60z4XOvc6xzrzOr86xIM+EzrfPgiDPgM67zrHPhM+Gz4zPgc68zrHPgiAoz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSDOvM61IM68zrnOsSDPgM+Bz47PhM63IM68zrHPhM65zqwpIM61zq/Ovc6xzrkgzrcgzrTPhc69zrHPhM+Mz4TOt8+EzrEgzrzOsc62zrnOus6uz4IgzrXOvs6xzrPPic6zzq7PgiDOtM61zrTOv868zq3Ovc+Jzr0uIArOlyDPgM67zrfPgc6/z4bOv8+BzrnOus6uIM+Az4HOv8+Dz4bOrc+BzrXOuSDOu8+Nz4POtyDOs865zrEgz4TOt869IM61zr7Osc6zz4nOs86uIM60zrXOtM6/zrzOrc69z4nOvSDOsc+Az4wgz4TOvyDOtM65zrHOtM6vzrrPhM+Fzr8gzrzOrc+Dz4kgzrzOuc6xz4Igz4TOtc+Hzr3Ouc66zq7PgiDPgM6/z4UgzrvOrc6zzrXPhM6xzrkgW1dlYiBTY3JhcGluZ10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2ViX3NjcmFwaW5nKSDOus6xzrkgzr/Phc+DzrnOsc+Dz4TOuc66zqwgz4PPhc68zrLOrM67zrXOuSDPg8+EzrfOvSDOu86uz4jOtyDOus6xzrkgzrHPgM6/zrjOrs66zrXPhc+Dzrcgz4TPic69IM60zrXOtM6/zrzOrc69z4nOvSDPg861IM60zr/OvM63zrzOrc69zrcgzrzOv8+Bz4bOri4KCs6gz4HOv866zrXOuc68zq3Ovc6/z4UgzrvOv865z4DPjM69IM69zrEgzrXOvs6szrPOv8+FzrzOtSDPh8+Bzq7Pg865zrzOsSDOtM61zrTOv868zq3Ovc6xIM6xz4DPjCDPhG8gzrXOu867zrfOvc65zrrPjCDOsc+Bz4fOtc6vzr8gz4DPhM6uz4POtc+Jzr0gz4TOv8+FIFtMZW9uYXJkbyBYQ10oaHR0cDovL3d3dy5za3kuZ3IvbGVvbmFyZG8vdHJhY2tzL0dSL2FsbHRpbWVzL2JyYW5kOmFsbCxjYXQ6MSxjbGFzczphbGwseGN0eXBlOmFsbCxjbHViOmFsbCxwaWxvdDphbGwsdGFrZW9mZjphbGwmc29ydE9yZGVyPWRhdGVBZGRlZCkgz4fPgc63z4POuc68zr/PgM6/zrnOrs+DzrHOvM61IM+EzrfOvSDOs867z47Pg8+DzrEgz4DPgc6/zrPPgc6xzrzOvM6xz4TOuc+DzrzOv8+NIFtSXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy8pIM66zrHOuSDPhM63zr0gzrLOuc6yzrvOuc6/zrjOrs66zrcgW3J2ZXN0XShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcnZlc3QvaW5kZXguaHRtbCkuCs6XIM67zq7PiM63IM+Ez4nOvSDOtM61zrTOv868zq3Ovc+Jzr0gzrHPhs6/z4HOrCDPhM6/IM+DzrfOvM61zq/OvyDOsc+Azr/Os861zq/Pic+DzrfPgiBbzqDOsc+BzrHOvM+FzrjOuc6sICjOlc67zrvOrM60zrEpXShodHRwOi8vd3d3LnNreS5nci9sZW9uYXJkby90YWtlb2ZmLzE0KS4Kzp8gzrrPjs60zrnOus6xz4IgzrPOuc6xIM+EzrfOvSDOu86uz4jOtyDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69IM60zrXOvSDOtM65zrHPhM6vzrjOtc+EzrHOuSDOtM63zrzPjM+DzrnOsS4gzqnPg8+Ez4zPg86/IM6/IM66z47OtM65zrrOsc+CIM6zzrnOsSDPhM63zr0gzrHOvc6szrvPhc+Dzrcgz4TOv8+Fz4IgzrXOr869zrHOuSDOtM65zrHOuM6tz4POuc68zr/PgiwgzrzOsc62zq8gzrzOtSDPhM6xIM6xz4DOv8+EzrXOu86tz4POvM6xz4TOsSAoz4DOr869zrHOus61z4IsIM60zrnOsc6zz4HOrM68zrzOsc+EzrEpLiDOlyDOsc69zqzOu8+Fz4POtyDPgM6xz4HOv8+Fz4POuc6szrbOtc+EzrHOuSDPg8+EzrfOvSDPg8+Fzr3Orc+HzrXOuc6xIM+Fz4DPjCDPhM63zr0gzrzOv8+Bz4bOriDOu8+MzrPOuc6/z4Ugz4DPgc6/zrPPgc6xzrzOvM6xz4TOuc+DzrzOv8+NIChsaXRlcmF0ZSBwcm9ncmFtbWluZykuCgojIM6Rzr3OrM67z4XPg863IM60zrXOtM6/zrzOrc69z4nOvQoKCiMjIM6Rzr3OrM6zzr3Pic+Dzrcgz4TOv8+FIM+Azq/Ovc6xzrrOsSDOtM61zrTOv868zq3Ovc+Jzr0KCs6Rz4HPh865zrrOrCDOtc65z4POrM6zzr/Phc68zrUgz4TOuc+CIM6xz4DOsc+BzrHOr8+EzrfPhM61z4IgzrLOuc6yzrvOuc6/zrjOrs66zrXPgi4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShnbHVlKQpsaWJyYXJ5KHBhcnNlZGF0ZSkKbGlicmFyeShjaHJvbikKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KGxlYWZsZXQucHJvdmlkZXJzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdndGhlbXIpCmxpYnJhcnkobWFncml0dHIpCmBgYAoKCs6jzrUgz4DPgc+Oz4TOvyDPg8+EzqzOtM65zr8gzrPOr869zrXPhM6xzrkgzrcgzrHOvc6szrPOvc+Jz4POtyDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69IM+Azr/PhSDOrc+Hzr/Phc68zrUgzrXOvs6szrPOtc65IM68zq3Pg8+JIHdlYiBzY3JhcGluZyDOsc+Az4wgz4TOt869IM65z4PPhM6/z4POtc67zq/OtM6xIM+Ezr/PhSBMZW9uYXJkbyBYQy4KCgrOkc+CIM60zr/Ous65zrzOrM+Dzr/Phc68zrUgzr3OsSDOtc66z4TPhc+Az47Pg86/z4XOvM61IM+EzrnPgiDPgM+Bz47PhM61z4IgzrPPgc6xzrzOvM6tz4Igz4TOv8+FIM+Dz4fOtc+EzrnOus6/z40gz4DOr869zrHOus6xIM60zrXOtM6/zrzOrc69z4nOvSAoZGF0YV9jbGVhbmVkKS4KCgpgYGB7cn0KbG9hZCgiZGF0YV9jbGVhbmVkLlJkYSIpCmhlYWQoZGF0YV9jbGVhbmVkKQoKYGBgCs6fIM+Azq/Ovc6xzrrOsc+CIM6tz4fOtc65IGByIGRhdGFfY2xlYW5lZCAlPiUgbnJvdygpYCDOtc6zzrPPgc6xz4bOrc+CLiDOlyDPgM+Bz47PhM63IM61zrnPg86xzrPPic6zzq4gz4DPhM6uz4POt8+CIM6zzrnOsSDPhM63zr0gz4PPhc6zzrrOtc66z4HOuc68zq3Ovc63IM+AzrXPgc65zr/Ph86uIM6xz4DOv86zzrXOr8+Jz4POt8+CIM6tzrPOuc69zrUgz4PPhM65z4IgYHIgZGF0YV9jbGVhbmVkJG15ZGF0ZSAlPiUgbWluKClgIM66zrHOuSDOtyDPhM61zrvOtc+Fz4TOsc6vzrEgzq3Os865zr3OtSAozrzOtSDPgM61z4HOuc6/z4HOuc+DzrzPjCDPhM63zr0gzrfOvM61z4HOv868zrfOvc6vzrEgzrvOrs+IzrfPgiDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69KSDPg8+EzrnPgiAgYHIgZGF0YV9jbGVhbmVkJG15ZGF0ZSAlPiUgbWF4KClgLgoKCs6Rz4IgzrTOv8+NzrzOtSDPhM+Jzr0gzrHPgc65zrjOvM+Ozr0gz4TPic69IM+Az4TOrs+DzrXPic69IM6xzr3OrM67zr/Os86xIM68zrUgz4TOv869IM+Ez43PgM6/IM+Ezr/PhSDPgM+EzrfPhM65zrrOv8+NIM68zq3Pg86/z4UuCs6Vzq/Ovc6xzrkgz4fOsc+BzrHOus+EzrfPgc65z4PPhM65zrrOriDOtyDOtc+AzrnOus+BzqzPhM63z4POtyDPhM6/z4UgYHIgIGRhdGFfY2xlYW5lZCAlPiUgZ3JvdXBfYnkodHlwZSkgJT4lIHRhbGx5KCkgJT4lIGFycmFuZ2UobikgJT4lIHRvcF9uKDEpICU+JSBwdWxsKHR5cGUpYC4KCmBgYHtyfQpkYXRhX2NsZWFuZWQgJT4lIGdyb3VwX2J5KHR5cGUpICU+JSB0YWxseSgpCmBgYAoKzpHPgiDOus+BzrHPhM6uz4POv8+FzrzOtSDOvM+Mzr3OvyDPhM65z4Igz4DPhM6uz4POtc65z4IgYHIgIGRhdGFfY2xlYW5lZCAlPiUgZ3JvdXBfYnkodHlwZSkgJT4lIHRhbGx5KCkgJT4lIGFycmFuZ2UobikgJT4lIHRvcF9uKDEpICU+JSBwdWxsKHR5cGUpYC4KCmBgYHtyfQpkYXRhX2NsZWFuZWQgPC0gZGF0YV9jbGVhbmVkICU+JWZpbHRlcih0eXBlPT1jKGRhdGFfY2xlYW5lZCAlPiUgZ3JvdXBfYnkodHlwZSkgJT4lIHRhbGx5KCkgJT4lIGFycmFuZ2UobikgJT4lIHRvcF9uKDEpICU+JSBwdWxsKHR5cGUpKSkgCgpgYGAKCs6RzrrOv867zr/Phc64zrXOryDOtyDOsc69zqzOu8+Fz4POtyDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69IM68zq3Pg8+JIM+Dz4XOs866zrXOus+BzrnOvM6tzr3Pic69IM60zrXOuc66z4TPjs69IM66zrHOuSBpbnRlcmFjdGl2ZSDOtM65zrHOs8+BzrHOvM68zqzPhM+Jzr06CgojIyDOoM67zq7OuM6/z4Igz4DPhM6uz4POtc+Jzr0gzrHOvc6sIM6tz4TOv8+CLgpgYGB7cn0KZ2d0aGVtcigiZWFydGgiLCB0eXBlPSJvdXRlciIsIGxheW91dD0ic2NpZW50aWZpYyIsIHNwYWNpbmc9MikKCnAgPC0gZGF0YV9jbGVhbmVkICU+JSAgZ3JvdXBfYnkoeWVhcikgJT4lIHRhbGx5KCkgJT4lIApnZ3Bsb3QoYWVzKHg9eWVhciwgeT1uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSsKICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJywgZm9ybXVsYT0geX54LCBzZT1GKSAKZ2dwbG90bHkocCkgIApgYGAKzozPgM+Jz4Igz4bOsc6vzr3Otc+EzrHOuSDOsc+Az4wgz4TOvyDPgM6xz4HOsc+AzqzOvc+JIM60zrnOrM6zz4HOsc68zrzOsSDPhM6/IM+AzrvOrs64zr/PgiDPhM+Jzr0gz4DPhM6uz4POtc+Jzr0gzq3Ph861zrkgzrHPhc6+zrfPhM65zrrOriDPhM6sz4POtyDOvM6tz4POsSDPg8+EzrfOvSDOtc65zrrOv8+DzrHOtc+Ezq/OsSAoz4DPgc6sz4POuc69zrcgzrPPgc6xzrzOvM6uKS4gCs6XIM6xz43Ovs63z4POtyDOvM+Azr/Pgc61zq8gzr3OsSDOv8+GzrXOr867zrXPhM6xzrkgz4POtSDPgM6xz4HOrM6zzr/Ovc+EzrXPgiDPgM6/z4Ugzq3Ph86/z4XOvSDOvc6xIM66zqzOvc6/z4XOvSDOvM61IM+EzrfOvSDPg8+EzrHOtM65zrHOus6uIM66zrHPhM6xzrPPgc6xz4bOriDPhM+Jzr0gz4DPhM6uz4POtc+Jzr0gz4PPhM6/IExlb25hcmRvIM66zrHOuM+Oz4IgzrHPhc+Ez4wgzrrOsc64zrnOtc+Bz47Ovc61z4TOsc65IM68zq3Pg86xIM+Dz4TOv869IM+Hz4HPjM69zr8sIM+EzrfOvSDPg8+Fz4fOvc+Mz4TOt8+EzrEgz4TPic69IM+Az4TOrs+DzrXPic69IM+Ez4nOvSDPhM6/z4DOuc66z47OvSDPgM65zrvPjM+Ez4nOvSwgz4TOt869IM61z4DOuc+DzrrOtc+IzrnOvM+Mz4TOt8+EzrEgz4TOt8+CIM+AzrXPgc65zr/Ph86uz4IgzrvPjM6zz4kgzrTOuc6xz4bOrs68zrnPg863z4IgzrrPhM67LgoKIyMgzpzOrc6zzrnPg8+Ezr8gTWF4X2FsdGl0dWRlLCDOvM6tzrPOuc+Dz4TOtyBtYXhfZGlzdGFuY2UgzrrOsc65IM68zq3Os865z4PPhM63IHhjX2Rpc3RhbmNlIM6xzr3OrCDOrc+Ezr/Pgi4KCs6jz4TOsSDPgM6xz4HOsc66zqzPhM+JIM60zrnOsc6zz4HOrM68zrzOsc+EzrEgzrHPgM6/z4TPhc+Az47Ovc61z4TOsc65IM63IM60zrnOsc+Hz4HOv869zrnOus6uIM61z4TOrs+DzrnOsSDOtM65zrHOus+NzrzOsc69z4POtyDPhM+Jzr0gzrrOsc+EzrHOs8+BzrHPhs+MzrzOtc69z4nOvSDOvM6tzrPOuc+Dz4TPic69IM6zzrnOsSDPhM65z4IgzrzOtc+EzrHOss67zrfPhM6tz4IKTWF4X2FsdGl0dWRlLCBtYXhfZGlzdGFuY2UgJiB4Y19kaXN0YW5jZS4KzpTOuc6xz4fPgc6/zr3Ouc66zqwgz4bOsc6vzr3Otc+EzrHOuSDPjM+EzrkgzrHOus6/zrvOv8+FzrjOv8+Nzr0gzrHPhc6+zrfPhM65zrrOriDPhM6sz4POty4KCmBgYHtyfQpwMSA8LQogIGRhdGFfY2xlYW5lZCAlPiUgIGdyb3VwX2J5KHllYXIpICU+JSBzdW1tYXJpc2UoCiAgICBNYXhfYWx0aXR1ZGUgPSBtYXgoTWF4X2FsdGl0dWRlLCBuYS5ybSA9IFQpLAogICAgbWF4X2Rpc3RhbmNlID0gbWF4KG1heF9kaXN0YW5jZSwgbmEucm0gPSBUKSwKICAgIHhjX2Rpc3RhbmNlPW1heCh4Y19kaXN0YW5jZSkKICApICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gTWF4X2FsdGl0dWRlOnhjX2Rpc3RhbmNlLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmFsdWUiKSAlPiUgCgpnZ3Bsb3QoYWVzKHg9eWVhciwgeT1WYWx1ZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrCiAgZmFjZXRfd3JhcCh+bmFtZSwgc2NhbGVzPSJmcmVlIiApCiAgCmdncGxvdGx5KHAxKSAgCmBgYAoKIyMgzqDOuc67z4zPhM6/z4IgzrzOtSDOvM6tzrPOuc+Dz4TOvyDPjc+Izr/PgiAoTWF4X2FsdGl0dWRlKSDOsc69zqwgzq3PhM6/z4IgzrrOsc65IM+Az4TOrc+Bz4XOs86xIM+Azr/PhSDPh8+BzrfPg865zrzOv8+Azr/Or863z4POtS4KCs6jz4TOvyDOsc66z4zOu86/z4XOuM6/IM60zrnOrM6zz4HOsc68zrzOsSDOus6xz4TOsc6zz4HOrM+GzrXPhM6xzrkgzrHOvc6sIM6tz4TOv8+CIM+Azr/Ouc+Mz4Igz4DOuc67z4zPhM6/z4Igz4POt868zrXOr8+Jz4POtSDPhM6/IM68zq3Os865z4PPhM6/IM+Fz4jPjM68zrXPhM+Bzr8gzrrOsc65IM68zrUgz4DOv865zqwgz4DPhM6tz4HPhc6zzrEuCmBgYHtyfQp0YmwyIDwtZGF0YV9jbGVhbmVkICU+JSAKICAgICAgICAgICAgIGdyb3VwX2J5KHllYXIgKSAlPiUKICAgICAgICAgICAgIGZpbHRlcihNYXhfYWx0aXR1ZGUgPT0gbWF4KE1heF9hbHRpdHVkZSwgbmEucm09VCkpICU+JSAKICBzZWxlY3QoeWVhcixwaWxvdCwgTWF4X2FsdGl0dWRlLCBicmFuZCkgCnRibDIKCmBgYAojIyMgzpXPgM65zrrPgc6xz4TOrc+Dz4TOtc+Bzr/PgiDPgM65zrvOv8+Ezr/PggoKCmBgYHtyfQp0YmwyICU+JSBncm91cF9ieShwaWxvdCkgJT4lIHRhbGx5KCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkKYGBgCs6Mz4DPic+CIM60zrXOr8+Hzr3Ov8+Fzr0gz4TOsSDOsc+Azr/PhM61zrvOrc+DzrzOsc+EzrEgz4TOv8+FIM+Azq/Ovc6xzrrOsSDOvyBgciB0YmwyICU+JSBncm91cF9ieShwaWxvdCkgJT4lIHRhbGx5KCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkgJT4lIHRvcF9uKDEpICU+JSBwdWxsKHBpbG90KWAgzrXOr869zrHOuSDOvyDPgM65zrvPjM+Ezr/PgiDPgM6/z4UgzrrOsc+Ezq3Ph861zrkgz4TOvyDPg8+FzrPOus61zrrPgc65zrzOrc69zr8gz4HOtc66zr/PgSDOs865zrEgz4DOv867zrvOrCDOrc+EzrcgKGByIHRibDIgJT4lIGdyb3VwX2J5KHBpbG90KSAlPiUgdGFsbHkoKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgdG9wX24oMSkgJT4lIHB1bGwobilgKS4KCiMjIM6gzrnOu8+Mz4TOv8+CIM68zrUgzrzOrc6zzrnPg8+EzrcgbWF4X2Rpc3RhbmNlIM6xzr3OrCDOrc+Ezr/PggoKzp8gzrXPgM+MzrzOtc69zr/PgiDPgM6vzr3Osc66zrHPgiDOtM61zq/Ph869zrXOuSDOsc69zqwgzq3PhM6/z4Igz4DOv865z4zPgiDPgM65zrvPjM+Ezr/PgiDOus6xz4TOrM6zz4HOsc+IzrUgz4TOt869IM68zrXOs86xzrvPjc+EzrXPgc63ICLOnM6tzrPOuc+Dz4TOtyDOsc+Az4zPg8+EzrHPg863Ii4KCmBgYHtyfQp0YmwzIDwtIGRhdGFfY2xlYW5lZCAlPiUgCiAgICAgICAgICAgICBncm91cF9ieSh5ZWFyICkgJT4lCiAgICAgICAgICAgICBmaWx0ZXIobWF4X2Rpc3RhbmNlID09IG1heChtYXhfZGlzdGFuY2UsIG5hLnJtPVQpKSAlPiUgCiAgc2VsZWN0KHllYXIscGlsb3QsIG1heF9kaXN0YW5jZSkgJT4lIGFycmFuZ2UoZGVzYyh5ZWFyLG1heF9kaXN0YW5jZSkpCnRibDMKYGBgCgoKIyMjIM6Vz4DOuc66z4HOsc+Ezq3Pg8+EzrXPgc6/z4Igz4DOuc67zr/PhM6/z4IKYGBge3J9CnRibDMgJT4lIGdyb3VwX2J5KHBpbG90KSAlPiUgdGFsbHkoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQpgYGAKzqTOvyDPgc61zrrPjM+BIM+AzrvOrs64zr/Phc+CIM61z4TPjs69IM66zrHPhM6tz4fOtc65IM6/IGByIHRibDMgJT4lIGdyb3VwX2J5KHBpbG90KSAlPiUgdGFsbHkoKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgdG9wX24oMSkgJT4lIHB1bGwocGlsb3QpYCDOvM61IGByIHRibDMgJT4lIGdyb3VwX2J5KHBpbG90KSAlPiUgdGFsbHkoKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgdG9wX24oMSkgJT4lIHB1bGwobilgIM6tz4TOty4KCgoKIyMgzqDOuc67z4zPhM6/z4IgzrzOtSDOvM6tzrPOuc+Dz4TOtyB4Y19kaXN0YW5jZSDOsc69zqwgzq3PhM6/z4IKCs6azrHPhM6sIM6xzr3PhM65z4PPhM6/zrnPh86vzrEgz4DPgc6/zrrPjc+Az4TOtc65IM6/IM60zrXOr866z4TOt8+CIM6zzrnOsSDPhM63zr0geGNfZGlzdGFuY2UuCgpgYGB7cn0KdGJsNCA8LSBkYXRhX2NsZWFuZWQgJT4lIAogICAgICAgICAgICAgZ3JvdXBfYnkoeWVhciApICU+JQogICAgICAgICAgICAgZmlsdGVyKHhjX2Rpc3RhbmNlID09IG1heCh4Y19kaXN0YW5jZSwgbmEucm09VCkpICU+JSAKICBzZWxlY3QoeWVhcixwaWxvdCwgeGNfZGlzdGFuY2UpCnRibDQKYGBgCgojIyMgzpXPgM65zrrPgc6xz4TOrc+Dz4TOtc+Bzr/PgiDPgM65zrvPjM+Ezr/PggpgYGB7cn0KdGJsNCAlPiUgZ3JvdXBfYnkocGlsb3QpICU+JSB0YWxseSgpICU+JSBhcnJhbmdlKGRlc2MobikpIAoKYGBgCgoKCiMjIM6gzrvOrs64zr/PgiDPgM+Ezq7Pg861z4nOvSDOsc69zqwgzpzOrs69zrEgz4TOv8+FIM6tz4TOv8+Fz4IgCgrOlc+AzrnPgM67zq3Ov869LCDPhM6xIM60zrXOtM6/zrzOrc69zrEgzrzPgM6/z4HOv8+Nzr0gzr3OsSDOsc69zrHOu8+FzrjOv8+Nzr0gzrzOtSDOss6sz4POtyDPhM6/zr0gzrzOrs69zrEuIM6jz4TOvyDOtc+Az4zOvM61zr3OvyDOtM65zqzOs8+BzrHOvM68zrEgzrHPgM6/zrTOr860zrXPhM6xzrkgz4TOvyDPgM67zq7OuM6/z4Igz4TPic69IM+Az4TOrs+DzrXPic69IM6xzr3OrCDOvM6uzr3OsS4gCgpgYGB7cn0KdGJsNSA8LSBkYXRhX2NsZWFuZWQgJT4lIAogICAgICAgICAgICAgZ3JvdXBfYnkobW9udGgpICU+JSAgdGFsbHkoKSU+JSBhcnJhbmdlKGRlc2MobikpCnA1IDwtIGdncGxvdCh0Ymw1LGFlcyh4PW1vbnRoLCB5PW4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpCmdncGxvdGx5KHA1KSAgCmBgYAoKzqDPgc6/zrrPjc+Az4TOtc65LCDPjM+Az4nPgiDOtc6vzr3Osc65IM6xzr3Osc68zrXOvc+MzrzOtc69zr8sIM6/zrkgz4DOtc+BzrnPg8+Dz4zPhM61z4HOtc+CIM+Az4TOrs+DzrXOuc+CIM69zrEgzrPOr869zr/Ovc+EzrHOuSDOsc+Az4wgz4TOvyDPg8+FzrPOus61zrrPgc65zrzOrc69zr8gz4POt868zrXOr86/IM+Az4TOrs+DzrfPgiDPhM6/IM66zrHOu86/zrrOsc6vz4HOuSwgzrzOtSDOvM6tzrPOuc+Dz4TOvyDOsc+BzrnOuM68z4wgz4DPhM6uz4POtc+Jzr0gz4TOv869IGByIHRibDUgJT4lIHRvcF9uKDEpICU+JSBwdWxsKG1vbnRoKWAuCgoKIyMgzpzOrc+Dzr8gzrrOsc65IE1heCDOs865zrEgz4TOuc+CIM68zrXPhM6xzrLOu863z4TOrc+CIE1heF9hbHRpdHVkZSDOus6xzrkgeGNfZGlzdGFuY2UsIM6xzr3OrCDOvM6uzr3OsQpgYGB7cn0KdGJsNiA8LSBkYXRhX2NsZWFuZWQgJT4lIAogICAgICAgICAgICAgZ3JvdXBfYnkobW9udGgpICU+JXN1bW1hcmlzZShNQVhfTWF4X2FsdGl0dWRlICA9IG1heChNYXhfYWx0aXR1ZGUsIG5hLnJtPVQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuX01heF9hbHRpdHVkZSA9IG1lYW4oTWF4X2FsdGl0dWRlLCBuYS5ybT1UKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4X3hjX2Rpc3RhbmNlID0gbWF4KHhjX2Rpc3RhbmNlLCBuYS5ybT1UKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhbl94Y19kaXN0YW5jZSA9IG1lYW4oeGNfZGlzdGFuY2UsIG5hLnJtPVQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCmBgYAojIyMgzpTOuc6szrPPgc6xzrzOvM6xIM68zq3Os865z4PPhM6/z4Ugz43PiM6/z4XPgiAgKE1heF9hbHRpdHVkZSkKCs6jz4TOvyDPgM6xz4HOsc66zqzPhM+JIM60zrnOrM6zz4HOsc68zrzOsSDPgM6xz4HOv8+Fz4POuc6szrbOtc+EzrHOuSDOtyDOvM6tz4POtyDPhM65zrzOriDOus6xzrkgz4TOvyDOvM6tzrPOuc+Dz4TOvyDOs865zrEgz4TOt869IM68zrXPhM6xzrLOu863z4TOriDOnM6tzrPOuc+Dz4TOvyDPjc+Izr/PgiAoTWF4X2FsdGl0dWRlKS4KCmBgYHtyfQpwNiA8LSBnZ3Bsb3QodGJsNiAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBNQVhfTWF4X2FsdGl0dWRlOk1lYW5fTWF4X2FsdGl0dWRlLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmFsdWUiKSAsCiAgKSArCiAgZ2VvbV9saW5lKGFlcyh4PW1vbnRoLCB5PVZhbHVlLCBncm91cD1uYW1lLGxpbmV0eXBlPW5hbWUpKSsKICB5bGFiKCJtZXRlcnMiKQoKZ2dwbG90bHkocDYpCmBgYAogIAoKCgojIyMgzpTOuc6szrPPgc6xzrzOvM6xIM68zq3Os865z4PPhM63z4IgzrHPgM+Mz4PPhM6xz4POt8+CIFhDICh4Y19kaXN0YW5jZSkKzqPPhM6/IM61z4DPjM68zrXOvc6/IM60zrnOrM6zz4HOsc68zrzOsSDOsc+AzrXOuc66zr/Ovc6vzrbOtc+EzrHOuSDOtyDOvM6tz4POtyDPhM65zrzOriDOus6xzrkgz4TOvyDOvM6tzrPOuc+Dz4TOvyDOs865zrEgz4TOt869IM68zrXPhM6xzrLOu863z4TOriAizpHPgM+Mz4PPhM6xz4POtyBYQyIuCgpgYGB7cn0KdGJsNmEgPC0gdGJsNiAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKE1heF94Y19kaXN0YW5jZSxNZWFuX3hjX2Rpc3RhbmNlKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiVmFyaWFibGUiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmFsdWUiKSAlPiUgc2VsZWN0KC0gYyhNQVhfTWF4X2FsdGl0dWRlLE1lYW5fTWF4X2FsdGl0dWRlKSkKcDcgPC0gZ2dwbG90KHRibDZhKSsKICBnZW9tX2xpbmUoYWVzKHg9bW9udGgsIHk9VmFsdWUsIGdyb3VwPVZhcmlhYmxlLGxpbmV0eXBlPVZhcmlhYmxlKSkrCiAgeWxhYigiS20iKQoKZ2dwbG90bHkocDcpIApgYGAKzozPgM+Jz4IgzrLOu86tz4DOv8+FzrzOtSDPgM6xz4HOsc+EzrfPgc61zq/PhM6xzrkgz4DOtc+Bzq/Otc+BzrPOtyDPg8+FzrzPgM61z4HOuc+Gzr/Pgc6sLgrOpM6/IM6mzrXOss+Bzr/Phc6sz4HOuc6/IM+AzrHPgc6xz4TOt8+BzrXOr8+EzrHOuSDOrc69zrEgzrzOrc6zzrnPg8+Ezr8gz4PPhM6/IHhjX2Rpc3RhbmNlIM68zrUgzrzOtc6zzqzOu863IM6xz4DPjM66zrvOuc+DzrcgzrHPgM+MIM+EzrfOvSDOvM6tz4POtyB4Y19kaXN0YW5jZSDPgM6/z4UgzrrOsc+EzrHOs8+BzqzPhs61z4TOsc65IM+Ezr/OvSDOvM6uzr3OsSDOsc+Fz4TPjCDOus6xz4TOrCDPhM63zr0gzrTOuc6sz4HOus61zrnOsSDPhM+Jzr0gMjAgzrXPhM+Ozr0uCs6gzqzOvM61IM69zrEgzrXOvc+Ezr/PgM6vz4POv8+FzrzOtSDPgM6/zrnOrCDOtc6vzr3Osc65IM63IM+Az4TOrs+DzrcgzrHPhc+Ezq4gzrrOsc65IM+Azr/Ouc+Mz4Igz4TOt869IM6tzrrOsc69zrUKYGBge3J9CmRhdGFfY2xlYW5lZCAlPiUgZmlsdGVyKHhjX2Rpc3RhbmNlPT10Ymw2YSAlPiUgZmlsdGVyKG1vbnRoPT0izqbOtc6yIiAmIFZhcmlhYmxlPT0nTWF4X3hjX2Rpc3RhbmNlJykgJT4lIHB1bGwoVmFsdWUpKSAlPiUgCiAgc2VsZWN0KHBpbG90LFVSTCkKICAKYGBgCgoKCiMjIM6czq3Pg863IM60zrnOrM+BzrrOtc65zrEgz4DPhM6uz4POt8+CIM6xzr3OrCDOrc+Ezr/PggoKzojOvc6xz4Igz4POt868zrHOvc+EzrnOus+Mz4IgzrTOtc6vzrrPhM63z4IgzrPOuc6xIM6tzr3OsSDPg863zrzOtc6vzr8gzrHPgM6/zrPOtc6vz4nPg863z4IgzrXOr869zrHOuSDOtyDOvM6tz4POtyDOtM65zqzPgc66zrXOuc6xIM+Az4TOrs+DzrfPgi4gzqPPhM6/IM+AzrHPgc6xzrrOrM+Ez4kgzrTOuc6szrPPgc6xzrzOvM6xIM6/IM60zrXOr866z4TOt8+CIM+AzrHPgc6/z4XPg865zqzOts61z4TOsc65IM6xzr3OrCDOrc+Ezr/Pgi4gzpXOr869zrHOuSDPh86xz4HOsc66z4TOt8+BzrnPg8+EzrnOus6uIM63IM61z4DOsc69zqzOus6xzrzPiM63IM66zrHOuSDOsc+Nzr7Ot8+Dzrcgz4TOt8+CICrOnM6tz4POtyDOtM65zqzPgc66zrXOuc6xIM+Az4TOrs+DzrfPgiogz4DOv8+FIM+AzrHPgc6xz4TOt8+BzrXOr8+EzrHOuSDOsc+Az4wgz4TOvyAyMDE1ICgyMDIxIM60zrXOvSDOrc66zrvOtc65z4POtSDOsc66z4zOvM6xKS4KCmBgYHtyfQpTeXMuc2V0ZW52KFRaPSdHTVQnKSAKdGJsOCA8LSBkYXRhX2NsZWFuZWQgJT4lIGdyb3VwX2J5KHllYXIpICU+JSAKICBzdW1tYXJpemUobWVhbl9kdXJhdGlvbj1tZWFuKGR1cmF0aW9uLCBuYS5ybT1UKSkgCnA4IDwtIGdncGxvdCh0Ymw4KSsKICBnZW9tX2xpbmUoYWVzKHg9eWVhciwgeT1tZWFuX2R1cmF0aW9uKSkrCiAgc2NhbGVfeV9jaHJvbihmb3JtYXQ9IiVIOiVNOiVTIikKZ2dwbG90bHkocDgpICAKYGBgCgoKCiMjIM6czq3Pg863IM60zrnOrM+BzrrOtc65zrEgz4DPhM6uz4POt8+CIM6xzr3OrCDOvM6uzr3OsQoKzpcgKs6czq3Pg863IM60zrnOrM+BzrrOtc65zrEgz4DPhM6uz4POt8+CKiDOrc+HzrXOuSDPgM61z4HOuc+Dz4PPjM+EzrXPgc6/IM61zr3OtM65zrHPhs6tz4HOv869IM+Ezr/Phc+CIM+AzrnOu8+Mz4TOv8+Fz4IgzrHOvSDOtc6+zrXOuc60zrnOus61z4XPhM61zq8gzrHOvc6sIM68zq7Ovc6xIM+Oz4PPhM61IM69zrEgzrPOvc+Jz4HOr862zr/Phc69IM+EzrEgz4DPhM63z4TOuc66zqwgz4fOsc+BzrHOus+EzrfPgc65z4PPhM65zrrOrCDOtc69z4zPgiDPg863zrzOtc6vzr/PhSDOsc+Azr/Os861zq/Pic+DzrfPgi4gCgpgYGB7cn0KdGJsOSA8LSBkYXRhX2NsZWFuZWQgJT4lIGdyb3VwX2J5KG1vbnRoKSAlPiUgCiAgc3VtbWFyaXplKG1lYW5fZHVyYXRpb249bWVhbihkdXJhdGlvbiwgbmEucm09VCkpIAoKcDkgPC0gZ2dwbG90KHRibDksYWVzKHg9bW9udGgsIHk9bWVhbl9kdXJhdGlvbiwgZ3JvdXA9MSkpKwogIGdlb21fbGluZSgpK2dlb21fcG9pbnQoKSsKICBzY2FsZV95X2Nocm9uKGZvcm1hdD0iJUg6JU06JVMiKQpnZ3Bsb3RseShwOSkgIApgYGAKCgojIyDOoM67zq7OuM6/z4Igz4DPhM6uz4POtc+Jzr0gzrHOvc6sIM+AzrnOu8+Mz4TOvyDOsc+Az4wgz4TOt869IM+Azq/Pg8+EzrEgzrHPgM6/zrPOtc6vz4nPg863z4IgCgrOlc69zrTOuc6xz4bOrc+Bzr/OvSDOrc+HzrXOuSDOus6xzrkgzrcgz4DOsc+BzrHOus6/zrvOv8+NzrjOt8+Dzrcgz4TOv8+FIM+Az4HOv8+Gzq/OuyDPhM+Jzr0gz4DOuc67z4zPhM+Jzr0gz4DOv8+FIM+AzrXPhM6szr3OtSDOsc+Az4wgz4TOt869IM+Dz4XOs866zrXOus+BzrnOvM6tzr3OtyDPgM61z4HOuc6/z4fOriDOsc+Azr/Os861zq/Pic+DzrfPgi4KzqPPhM6/IM+AzrHPgc6xzrrOrM+Ez4kgz4DOsc+BzqzOtM61zrnOs868zrEgz4DOsc+BzrHPhM6vzrjOtc+EzrHOuSDOrc69zrHPgiDPgM6vzr3Osc66zrHPgiDOvM61IM+Ezr8gz4DOu86uzrjOv8+CIM+Ez4nOvSDPgM+Ezq7Pg861z4nOvSDOsc+Az4wgz4TOt869IM+Azq/Pg8+EzrEgzrHPgM6/zrPOtc6vz4nPg863z4IuCs6Mz4DPic+CIM+GzrHOr869zrXPhM6xzrksIM+EzrnPgiDPgM61z4HOuc+Dz4PPjM+EzrXPgc61z4Igz4DPhM6uz4POtc65z4IgzrHPgM+MIM+EzrfOvSDPgM61z4HOuc6/z4fOriDOsc+Azr/Os861zq/Pic+DzrfPgiDPhM65z4Igzq3Ph861zrkgzrrOrM69zrXOuSDOvyAKYHIgZGF0YV9jbGVhbmVkICU+JSBncm91cF9ieShwaWxvdCkgJT4lICBzdW1tYXJpc2Uobj1uKCkpICU+JSBhcnJhbmdlKGRlc2MobiwgbmEucm09VCkpICU+JSB0b3BfbigxKSAlPiUgcHVsbChwaWxvdClgLgogCmBgYHtyfQpkYXRhX2NsZWFuZWQgJT4lIGdyb3VwX2J5KHBpbG90KSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgYXJyYW5nZShkZXNjKG4sIG5hLnJtPVQpKQoKYGBgCgojIyDOo8+Fzr3Ov867zrnOus6uIHhjX2Rpc3RhbmNlIM6xzr3OrCDPgM65zrvPjM+Ezr8gzrHPgM+MIM+EzrfOvSDPgM6vz4PPhM6xIM6xz4DOv86zzrXOr8+Jz4POt8+CIAoKzpHOvc+Ezq/Pg8+Ezr/Ouc+HzrEgzrzPgM6/z4HOtc6vIM69zrEgz4XPgM6/zrvOv86zzrnPg8+EzrXOryDOus6xzrkgzrcgKs6jz4XOvc6/zrvOuc66zq4geGNfZGlzdGFuY2UgzrHOvc6sIM+AzrnOu8+Mz4TOvyouCgoKYGBge3J9CmRhdGFfY2xlYW5lZCAlPiUgZ3JvdXBfYnkocGlsb3QpICU+JSAKICBzdW1tYXJpc2Uoc3VtX3hjX2Rpc3RhbmNlPXN1bSh4Y19kaXN0YW5jZSwgbmEucm09VCkpICU+JSBhcnJhbmdlKGRlc2Moc3VtX3hjX2Rpc3RhbmNlKSkKCmBgYAoKIyMgzqPPhc69zr/Ou865zrrOriDOtM65zqzPgc66zrXOuc6xIM+Az4TOrs+DzrXPic69IM6xzr3OrCDPgM65zrvPjM+Ezr8gzrHPgM+MIM+EzrfOvSDPgM6vz4PPhM6xIM6xz4DOv86zzrXOr8+Jz4POt8+CIArOoM6xz4HOv8+Fz4POuc6szrbOv869z4TOsc65IM6/zrkgdG9wIDEwIM+AzrnOu8+Mz4TOv865LiDOpM6xIM6xz4DOv8+EzrXOu86tz4POvM6xz4TOsSDOtc6vzr3Osc65IM+DzrUgz47Pgc61z4IoaCkgOiAKYGBge3J9CnRibDEwIDwtIGRhdGFfY2xlYW5lZCAlPiUgCiAgZ3JvdXBfYnkocGlsb3QpICU+JSAKICBzdW1tYXJpc2UoZHVyYXRpb249c3VtKGR1cmF0aW9uLCBuYS5ybT1UKSoyNCkgJT4lIAogIHRvcF9uKDEwKSAlPiUgCiAgYXJyYW5nZShkZXNjKGR1cmF0aW9uKSkKdGJsMTAKcDEwIDwtIHRibDEwICU+JSAKZ2dwbG90KGFlcyh4PXJlb3JkZXIocGlsb3QsIC1kdXJhdGlvbikgLCB5PWFzLm51bWVyaWMoZHVyYXRpb24pKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSsKICB4bGFiKCJwaWxvdCIpKwogIHlsYWIoInRvdGFsIGZsaWdodCB0aW1lIChoKSIpKwogICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpIApnZ3Bsb3RseShwMTApCgoKCmBgYAoKIyDOlc+Azq/Ou86/zrPOv8+CCgrOn865IM60zrXOr866z4TOtc+CIM+Azr/PhSDPhc+Azr/Ou86/zrPOr8+Dz4TOt866zrHOvSDOtc6vzr3Osc65IM61zr3OtM61zrnOus+EzrnOus6/zq8gzrrOsc65IM60zrXOr86zzrzOsSDPhM+Jzr0gzrTPhc69zrHPhM6/z4TOrs+Ez4nOvSDPgM6/z4Ugz4DPgc6/z4PPhs6tz4HOv869z4TOsc65IM6xz4DPjCDPhM63zr0gz4PPhM65zrPOvM6uIM+Azr/PhSDOvyDPh8+Bzq7Pg8+EzrfPgiDOus6xz4TOsc+Gzq3Pgc61zrkgzr3OsSDOsc69zrHOus+Ezq7Pg861zrkgz4TOsSDOtM61zrTOv868zq3Ovc6xIM+Azr/PhSDOtc+Azq8gz4fPgc+Mzr3Ouc6xIM6xz4DOv864zrfOus61z43Ov869z4TOsc65IM+Dz4TOvyBMZW9uYXJkbyBYQy4gzpHOvc6szrvOv86zzrEgz4TOuc+CIM6xz4DOsc65z4TOrs+DzrXOuc+CIM66zrHOuSDPhM65z4IgzrHOvc6szrPOus61z4IsIM+EzrEgzrXPgc+Jz4TOrs68zrHPhM6xIM+Az4HOv8+CIM+EzrEgzrTOtc60zr/OvM6tzr3OsSDOvM+Azr/Pgc6/z43OvSDOvc6xIM+AzrHPgc6xzrzOtc+Ez4HOv8+Azr/Ouc63zrjOv8+Nzr0gzrrOsc65IM69zrEgzrXPgM65zrrOtc69z4TPgc+JzrjOv8+Nzr0gz4POtSDPgM65zr8gz4PPhc6zzrrOtc66z4HOuc68zq3Ovc6xIM+HzrHPgc6xzrrPhM63z4HOuc+Dz4TOuc66zqwgz4DOv8+FIM6xz4bOv8+Bzr/Pjc69IM+EzrfOvSDPg8+NzrPOus+BzrnPg863IM+AzrnOu8+Mz4TPic69LCDPgM61z4HOuc6/z4fPjs69LCDOtc+Ez47OvSDOriDOvM63zr3Pjs69LiDOo861IM66zrHOvM6vzrEgz4DOtc+Bzq/PgM+Ez4nPg863IM6/zrkgz4PPhc6zzrrPgc6vz4POtc65z4IgzrHPhc+Ezq3PgiDOtM61zr0gzrjOsSDPgM+Bzq3PgM61zrkgzr3OsSDOrc+Hzr/Phc69IM+DzrHOvSDOsc+Azr/PhM6tzrvOtc+DzrzOsSDPhM63zr0gzrHOvc6sz4DPhM+Fzr7OtyDOsc69z4TOsc6zz4nOvc65z4PPhM65zrrOv8+NIM66zrvOr868zrHPhM6/z4IgzrHOvc6szrzOtc+DzrEgz4PPhM6/z4XPgiDPgM65zrvPjM+Ezr/Phc+CIM66zrHOuSDPhM63zr0gz4XPgM6tz4HOss6xz4POtyDPhM+Jzr0gzr/Pgc6vz4nOvSDPhM6/z4XPgiDOus6xzrkgz4TPic69IM66zrHOvc+Mzr3Pic69IM6xz4PPhs6xzrvOtc6vzrHPgi4KzqTOrc67zr/PgiwgzrrPgc6vzr3Otc+EzrHOuSDOsc69zrHOs866zrHOr86xIM68zrnOsSDOsc69zrHOss6szrjOvM65z4POtyDPg8+Ezr8gTGVvbmFyZG8gWEMgz4DOv8+FIM64zrEgzrTOr869zrXOuSDPhM63zr0gzrTPhc69zrHPhM+Mz4TOt8+EzrEgzqzOvM61z4POt8+CIM61zr7Osc6zz4nOs86uz4Igz4TPic69IM60zrXOtM6/zrzOrc69z4nOvSDPh8+Jz4HOr8+CIM+Ezr8gzrrPjM+Dz4TOv8+CIM66zrHOuSDPhM63zr0gz4DOv867z4XPgM67zr/Ous+Mz4TOt8+EzrEgzrTOuc6xzrTOuc66zrHPg865z47OvSB3ZWIgc2NyYXBpbmcuCgrOlM65zrXPhc66z4HOr869zrfPg863OiDOtM61zr0gz4DOtc+EzqzPiSDOvM61IM66zrHOvc6tzr3OsSDPgM+EzrfPhM65zrrPjCDOvM6tz4POvy4KCgoKCg==